package day15;
/*本类用于实现多线程编程方式一 extends Thread*/
public class Thread1 {
    public static void main(String[] args) {
        /*如果只是调用两个线程的run(),那么会先执行完一个线程,再执行另一个线程
        * 不会有多线程抢占资源的效果,所以,我们真的能通过run()来执行多线程任务吗?*/
        /*run()与start()本质上的区别,run()只能当做一个顺序执行的单线程普通方法
        * 并没有多线程抢占的效果,所以,如果想以多线程的效果干活,必须调用start()
        * 才能真正的起动线程*/
        //5.创建自定义线程类对象
        MyThread t = new MyThread();/*new 对应的就是新建状态*/
        //6.模拟多线程,需要至少启动2个线程,如果只启动一个线程,是单线程程序
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread("旺财");
        //t2.run();
        //t.run();
        /*当我们调用start()启动线程时,虚拟机会自动调用run()的业务*/
        t.start();/*对应的是就绪状态*/
        t2.start();
        t3.start();
        /*测试结果:线程有随机性,执行的结果是不可控的.因为这是CPU在调度的,我们无法控制*/
    }
}
//1.自定义多线程类
class MyThread extends Thread{
    public MyThread() {
    }
    public MyThread(String name) {
        //调用父类的含参构造,将线程名传给Thread类的含参构造方法,给线程起名字
        super(name);
    }

    //2.1线程中的业务必须写在run()里--规定!!!
    /*父类的实现是我们不需要的,我们有自己的业务*/
    //3.重写父类中的run()--不想使用父类的功能
    @Override
    public void run() {
        /*super表示父类对象的引用,也就是使用的是Thread类本身的业务,不用*/
        // super.run();
        //4.写业务:输出10次当前正在执行的线程名称
        for(int i = 1; i < 11 ; i++){
            /*getName()可以获取正在执行任务的线程名称,使用的是继承过来的方法*/
            System.out.println(i+"="+getName());
        }
    }
}






